/*----------------------------------------------------------
* FILE: ModelDtoConvertor.java
* LOGICAL NAME: ModelDtoConvertor
* PRODUCT: bila-framework
*----------------------------------------------------------
* MODIFICATIONS
* DATE Oct 9, 2011
* AUTHOR wjuarez
*----------------------------------------------------------
*/

package bila.framework.services;

import java.util.ArrayList;
import java.util.List;

import bila.framework.commons.BeanHelper;
import bila.framework.commons.GeneralFunction;

/**
 * @author WJuarez
 * <b>Created by </b>wjuarez
 * <b>for</b> bila-framework
 * <b>package</b> bila.framework.services
 * <b>on</b> Oct 9, 2011 9:37:22 AM
 * <b>Purpose</b> 
 * <p>
 *		Clase abstracta con los metodos necesarios para convertir un objeto modelo
 *		a uno dto y viceversa, ademas posee metodos para crear lista de objetos modelos y dtos
 * </p>
 */
public abstract class ModelDtoConvertor<Dto, Model, ModelId> {

	private Class<Dto> dtoClass;
	private Class<Model> modelClass;
	private Class<ModelId> modelIdClass;
	
	public ModelDtoConvertor(Class<Dto> dtoClass, Class<Model> modelClass, Class<ModelId> modelIdClass){
		this.dtoClass = dtoClass;
		this.modelClass = modelClass;
		this.modelIdClass = modelIdClass;
	}
	
	/**
	 * Crea un objeto Modelo a partir de un DTO
	 * @param dto objeto DTO
	 * @return un objeto Modelo
	 * @throws Exception
	 */
	public abstract Model createModel(Dto dto) throws Exception;
	
	/**
	 * Crea un objeto DTO a partir de un modelo
	 * @param model objeto de la base
	 * @return objeto DTO
	 * @throws Exception
	 */
	public abstract Dto createDto(Model model) throws Exception;
	
	/**
	 * Crea una lista de Modelo a partir de una lista de DTO
	 * @param dtoList objeto de tipo List<Dto>
	 * @return objeto de tipo List<Model>
	 * @throws Exception
	 */
	public List<Model> createModelList(List<Dto> dtoList) throws Exception{
		List<Model> list = new ArrayList<Model>();
		for(Dto dto : dtoList){
			Model model = createModel(dto);
			list.add(model);
		}
		return list;
	}
	
	/**
	 * Crea una lista de DTO a partir de una lista de Modelos
	 * @param modelList objeto de tipo List<Model>
	 * @return una lista List<Dto>
	 * @throws Exception
	 */
	public List<Dto> createDtoList(List<Model> modelList) throws Exception{
		List<Dto> list = new ArrayList<Dto>();
		for(Model model : modelList){
			Dto dto = createDto(model);
			list.add(dto);
		}
		return list;
	}
	
	/**
	 * Crea un objeto ModelId a partir de un DTO
	 * @param dto objeto DTO
	 * @return objeto ModelID
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public ModelId createId(Dto dto) throws InstantiationException, IllegalAccessException{
		ModelId model = modelIdClass.newInstance();
		if(!GeneralFunction.isNullOrEmpty(dto))
			BeanHelper.copyAttributes(dto, model, null);
		return model;
	}

	public Class<Dto> getDtoClass() {
		return dtoClass;
	}

	public Class<Model> getModelClass() {
		return modelClass;
	}

	public Class<ModelId> getModelIdClass() {
		return modelIdClass;
	}
	
	
	
}
